Use the projection to flip around the content
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 2 Aug 2016 15:58:47 +0000 (16:58 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:10 +0000 (11:49 +0100)
Since we use an FBO to render the contents of the render node tree, the
coordinate space is going to be flipped in GL. We can undo the flip by
using an appropriate projection matrix, instead of changing the sampling
coordinates in the shaders and updating all our coordinates at render
time.

gsk/gskglrenderer.c
gsk/resources/glsl/blend.fs.glsl
gsk/resources/glsl/blend.vs.glsl
gsk/resources/glsl/blit.vs.glsl
gtk/gtkwindow.c

index 093ed465e752287197d702711d158edb01fe5352..22e15587293fb21b3726c9c5980b838fb093e5cf 100644 (file)
@@ -618,7 +618,6 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
   else
     item.parent_data = NULL;
 
-  /* Select the render target; -1 is the default */
   if (render_node_needs_render_target (node))
     {
       item.render_data.render_target_id =
@@ -839,7 +838,6 @@ gsk_gl_renderer_render (GskRenderer *renderer,
   glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
   glBlendEquation (GL_FUNC_ADD);
 
-  /* Transparent pass: back-to-front */
   GSK_NOTE (OPENGL, g_print ("Rendering %u items\n", self->render_items->len));
   for (i = 0; i < self->render_items->len; i++)
     {
@@ -851,7 +849,7 @@ gsk_gl_renderer_render (GskRenderer *renderer,
   /* Draw the output of the GL rendering to the window */
   gsk_gl_driver_end_frame (self->gl_driver);
   gpu_time = gsk_gl_profiler_end_gpu_region (self->gl_profiler);
-  GSK_NOTE (OPENGL, g_print ("GPU time: %" G_GUINT64_FORMAT " nsec\n", gpu_time));
+  GSK_NOTE (OPENGL, g_print ("GPU time: %g usec\n", (double) gpu_time / 1000.0));
 
 out:
   /* XXX: Add GdkDrawingContext API */
index 102950b00de1a4e216267953b31188776446a89a..39b3e4c65730627facb806c5215584e44589d8c4 100644 (file)
@@ -28,8 +28,8 @@ vec3 BlendLighten(vec3 Cb, vec3 Cs) {
 }
 
 void main() {
-  vec4 Cb = Texture(uSource, vUv);
-  vec4 Cs = Texture(uMask, vUv);
+  vec4 Cs = Texture(uSource, vUv);
+  vec4 Cb = Texture(uMask, vUv);
   vec3 res;
 
   if (uBlendMode == 0) {
index b947a7a9b5a5cbb0b4450626282eafded5ae2b63..1208513f33250c920bc6543d56f4fabc74c1cb5f 100644 (file)
@@ -2,5 +2,5 @@ void main() {
   gl_Position = uMVP * vec4(aPosition, 0.0, 1.0);
 
   // Flip the sampling
-  vUv = vec2(aUv.x, 1.0 - aUv.y);
+  vUv = vec2(aUv.x, aUv.y);
 }
index b947a7a9b5a5cbb0b4450626282eafded5ae2b63..1208513f33250c920bc6543d56f4fabc74c1cb5f 100644 (file)
@@ -2,5 +2,5 @@ void main() {
   gl_Position = uMVP * vec4(aPosition, 0.0, 1.0);
 
   // Flip the sampling
-  vUv = vec2(aUv.x, 1.0 - aUv.y);
+  vUv = vec2(aUv.x, aUv.y);
 }
index 786de023c51bb3bec4ce60335ae10a5b13b590b8..4b10b409ff5df93c1d8db5e85083023ad21a6af4 100644 (file)
  * instead.
  */
 
+#define ORTHO_NEAR_PLANE        -10000
+#define ORTHO_FAR_PLANE          10000
+
 typedef struct _GtkWindowPopover GtkWindowPopover;
 
 struct _GtkWindowPopover
@@ -446,8 +449,6 @@ static void gtk_window_real_activate_focus   (GtkWindow         *window);
 static void gtk_window_keys_changed          (GtkWindow         *window);
 static gboolean gtk_window_enable_debugging  (GtkWindow         *window,
                                               gboolean           toggle);
-static gint gtk_window_draw                  (GtkWidget         *widget,
-                                             cairo_t           *cr);
 static GskRenderNode *gtk_window_get_render_node (GtkWidget   *widget,
                                                   GskRenderer *renderer);
 static void gtk_window_unset_transient_for         (GtkWindow  *window);
@@ -7263,8 +7264,9 @@ _gtk_window_set_allocation (GtkWindow           *window,
 
       graphene_matrix_init_ortho (&projection,
                                   0, allocation->width * scale,
-                                  0, allocation->height * scale,
-                                  -1, 1);
+                                  allocation->height * scale, 0,
+                                  ORTHO_NEAR_PLANE,
+                                  ORTHO_FAR_PLANE);
       gsk_renderer_set_projection (priv->renderer, &projection);
 
       graphene_matrix_init_translate (&modelview,